/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "节点视口工作区.h"

#include "框架/工作区/ui节点视口.h"
#include "框架/工作区/节点视口/ui节点创建菜单.h"
#include "框架/工作区/通用弹出菜单.h"



//static std::vector<C_Widget*>		g_节点视口s;
//static std::set<C_节点视口*>		g节点视口;
//static C_Widget* g物体节点创建菜单 = nullptr;

static bool on_文件处理回调(C_Widget* self, const std::vector<std::string>& name, E_对话框类型 方式) {
	for (auto& e : name) {
		auto 后缀 = f_file_文件扩展名(e);
		if (后缀 == "png" || 后缀 == "jpg" || 后缀 == "tga") {

		}
	}
	return true;
}



class C_节点视口状态条 : public C_状态条 {

public:
	C_节点视口状态条(S_UI创建环境& ctx) : C_状态条(ctx) {
		m_View = nullptr;
	}

	S_Props		m_节点树容器;
	C_节点视口*	m_View;

};

//static void on_节点树列表_编辑名称(S_Props& prop) {
//	auto& p = f_prop_MapPrt(prop);
//}

static void f_PropUpdate_返回上一级节点树(S_Props& prop) {
}

static void on_节点树列表_项改变(S_Props& prop, S_MapPtr& ptrItem, int32 操作类型) {
	C_节点视口状态条* bar = static_cast<C_节点视口状态条*>(prop.m_UI->m_部件->m_父部件->m_父部件);


	switch (操作类型) {
	case E_Prop_MapPtr_项事件类型::e_项删除:
		ptrItem.m_PtrItem.erase(ptrItem.m_PtrItem.begin() + ptrItem.m_当前项);
		break;

	case E_Prop_MapPtr_项事件类型::e_项名称改变: {
		auto& e = ptrItem.m_PtrItem[ptrItem.m_当前项];
		((C_节点树*)e.m_Ptr)->G节点名称分配.f_Move(e.m_Str);
		e.m_Str = ((C_节点树*)e.m_Ptr)->G节点名称分配.f_Gen(e.m_Str);
		//ptrItem.m_PtrItem[ptrItem.m_当前项].m_Str;
		break;
	}

	case E_Prop_MapPtr_项事件类型::e_项添加: {
		S_MapPtrItem item;
		C_节点树* tree = f_node_Create节点树(true);
		
		bar->m_View->f_绑定节点树(tree);
		break;
	}

	default: {
		uint32 offset = ptrItem.m_当前项;
		S_MapPtrItem& item = ptrItem.m_PtrItem[offset];

		bar->m_View->f_绑定节点树((C_节点树*)item.m_Ptr);
		break;
	}
	}

}


static bool on_项选择_切换节点树(C_Widget* self, const S_列表填充数据& item) {
	C_节点视口状态条* bar = static_cast<C_节点视口状态条*>(self->m_父部件->m_父部件);

	C_节点树* tree = (C_节点树*)item.m_Data;
	bar->m_View->f_绑定节点树(tree);

	return true;
}



//static void on_节点树列表_重构节点视口内节点(S_Props& prop) {
//	auto& p = f_prop_MapPrt(prop);
//}

/*void on_工作区联动更新(E_工作区类型 主工作区, C_工作区页面* 工作区) {
	//更新指定节点
	//auto node = f_global_get激活节点();
	C_节点视口状态条* bar = static_cast<C_节点视口状态条*>(工作区->m_状态条);
	f_NodeView_更新节点(bar->m_View);
}*/

void f_工作区页面_物体节点工作区初始化(S_UI创建环境& ctx) {
	C_节点视口::g物体节点创建菜单 = f_init物体节点创建菜单(ctx);
	C_节点视口::g函数节点创建菜单 = f_init函数节点创建菜单(ctx);
	C_节点视口::g多边形节点创建菜单 = f_init多边形节点创建菜单(ctx);
	C_节点视口::g材质节点创建菜单 = f_init材质节点创建菜单(ctx);
	C_节点视口::g着色器节点创建菜单 = f_init着色器节点创建菜单(ctx);
	C_节点视口::g节点层级切换面板 = f_ui_创建扩展弹出菜单(ctx, E_方向::e_纵向, true);
	

	f_init_物体节点创建_绑定视口回调(f_NodeView_其他工作区添加面板到视口, f_NodeView_添加节点面板到视口);
	//f_init节点视口(ctx.m_Ctx);
}

C_工作区页面* f_工作区_create节点视口(S_UI创建环境& ctx) {
	
	auto 状态条 = new C_节点视口状态条(ctx);
	
	状态条->m_节点树容器 = f_alloc_MatPtr2DProp(S_节点数据::g_节点树容器, L"节点树");
	//状态条->m_节点树容器 = f_alloc_StrIndexProp(S_节点数据::g_物体节点树, L"");
	
	auto& p = f_prop_映射引用2D(状态条->m_节点树容器);
	p.mf_元素选择 = on_项选择_切换节点树;

	C_节点树* t = nullptr;
	if (p.m_PtrItem[0]->size()) {
		t = (C_节点树*)p.m_PtrItem[0]->back().m_Ptr;
	}
	else {
		t = f_node_Create节点树(true, L"默认节点树");
	}

	auto* nodeview = f_NodeView_创建节点窗口(ctx, t);
	nodeview->m_节点树容器 = 状态条->m_节点树容器;
	状态条->m_View = nodeview;


	auto* 滚动窗口 = f_ui_创建滚动框(ctx, true, false, nodeview);
	滚动窗口->mf_鼠标滚轮 = nullptr;
	nodeview->m_节点菜单 = C_节点视口::g物体节点创建菜单;
	nodeview->m_节点删除菜单 = f_通用菜单_节点删除菜单(ctx, on_NodeView_删除节点菜单项);
	nodeview->mf_以节点构建节点 = f_节点构建_从节点构建节点;
	nodeview->mf_节点重构回调 = f_节点构建_重构;
	nodeview->mf_名称构建节点面板 = f_节点构建_用名称构建节点面板;
	//g_节点视口s.push_back(nodeview);


	C_工作区页面* 工作区 = new C_工作区页面(E_工作区类型::e_节点视口, ctx, E_方向::e_横向, 滚动窗口, 状态条, nodeview->m_属性栏);

	f_节点工作区_重构状态条(工作区->m_状态条);
    return 工作区;
}




C_工作区页面* f_工作区_create材质节点视口(S_UI创建环境& ctx) {
	auto 状态条 = new C_节点视口状态条(ctx);

	状态条->m_节点树容器 = f_alloc_StrIndexProp(S_框架::g_材质节点树, L"");
	状态条->m_节点树容器.m_UI->m_Update = on_节点树列表_编辑名称;
	auto& p = f_prop_MapPrt(状态条->m_节点树容器);

	C_节点树* t = f_node_Create节点树(true);
	S_MapPtrItem item;
	item.m_Ptr = t;
	item.m_Str = t->m_IDName;
	p.m_PtrItem.push_back(item);
	p.mf_元素变更 = on_节点树列表_项改变;


	auto* nodeview = f_NodeView_创建节点窗口(ctx, t);
	nodeview->mf_名称构建节点面板 = f_节点构建_用名称构建节点面板;
	状态条->m_View = nodeview;

	auto* 滚动窗口 = f_ui_创建滚动框(ctx, true, false, nodeview);
	//f_Widget_开启视口属性(滚动窗口);
	//nodeview->m_扩展视口属性->m_偏移比例 = { 0.5f,0.5f };
	//nodeview->m_扩展视口属性->m_缩放后边界 = { 1024, 1024 };
	//滚动窗口->mf_文件处理回调 = on_文件处理回调;

	C_工作区页面* 工作区 = new C_工作区页面(E_工作区类型::e_材质节点视口, ctx, E_方向::e_横向, 滚动窗口, 状态条, nodeview->m_属性栏);
	f_节点工作区_重构状态条(工作区->m_状态条);
	return 工作区;
}


C_Widget* f_工作区_get节点视口(uint32 id) {
	//if (g_节点视口s.size() > id) {
	//	return g_节点视口s[id];
	//}
	return nullptr;
}






static void on_3D视口场景物体显示方式(S_Props& prop) {

}

static void on_节点树排列方向切换(S_Props& prop) {

}



void f_节点工作区_重构状态条(C_状态条* 状态条) {
	C_节点视口状态条* bar = static_cast<C_节点视口状态条*>(状态条);
	

	std::vector<S_Props> props;
	S_Props	prop;

	prop = f_alloc_OpsProp(f_PropUpdate_返回上一级节点树, L"返回上一级");
	props.push_back(prop);
	
	props.push_back(f_alloc_NoneProp());
	props.push_back(bar->m_节点树容器);
	props.push_back(f_alloc_NoneProp());
	prop = f_alloc_EnumProp(nullptr,
		{ {L"显示所有", "布尔并"}, {L"独显选择", "布尔阳"}, {L"隐藏未选择", "布尔阴"} },
		L"场景物体显示方式",
		0,
		on_3D视口场景物体显示方式);
	props.push_back(prop);

	props.push_back(f_alloc_NoneProp());
	prop = f_alloc_EnumProp(nullptr, { 
	{L"横向排列", "横向排列"}, 
	{L"纵向排列", "纵向排列"},
	
	},
		L"排列方向",
		0,
		on_节点树排列方向切换);

	f_prop_MapPrt(bar->m_节点树容器).m_当前项;

	props.push_back(prop);

	状态条->f_构建属性部件(props, 状态条);

}





E_事件是否传递 f_节点工作区_拷贝节点(C_Widget* self, uint8 状态) {

	return E_事件是否传递();
}

void f_物体节点工作区_保存工作区状态(FILE* f, C_工作区页面* 页面) {
	C_节点视口状态条* bar = static_cast<C_节点视口状态条*>(页面->m_状态条);

	auto& 映射项 = f_prop_映射引用2D(bar->m_节点树容器);
	//S_MapPtr& 映射项 = f_prop_MapPrt(bar->m_节点树容器);
	fwrite(&映射项.m_当前项, sizeof(映射项.m_当前项), 1, f);
	fwrite(bar->m_View->m_扩展视口属性, sizeof(S_View属性), 1, f);
}

void f_物体节点工作区_加载工作区状态(FILE* f, C_工作区页面* 页面) {
	C_节点视口状态条* bar = static_cast<C_节点视口状态条*>(页面->m_状态条);

	auto& 映射项 = f_prop_映射引用2D(bar->m_节点树容器);
	//S_MapPtr& 映射项 = f_prop_MapPrt(bar->m_节点树容器);
	fread(&映射项.m_当前项, sizeof(映射项.m_当前项), 1, f);
	fread(bar->m_View->m_扩展视口属性, sizeof(S_View属性), 1, f);

	bar->m_View->f_绑定节点树((C_节点树*)((*映射项.m_PtrItem[映射项.m_当前项.x])[映射项.m_当前项.y].m_Ptr));
	//bar->m_View->f_绑定节点树((C_节点树*)映射项.m_PtrItem[映射项.m_当前项].m_Ptr);
}












